package com.bw.producer.service.impl;

import com.bw.common.core.text.Convert;
import com.bw.common.redis.service.RedisService;
import com.bw.common.security.utils.SecurityUtils;
import com.bw.model.LoginUser;
import com.bw.producer.Vo.CartItemVo;
import com.bw.producer.Vo.CartRequest;
import com.bw.producer.Vo.CartVo;
import com.bw.producer.mapper.CartItemMapper;
import com.bw.producer.service.CartItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Slf4j
@Service
public class CartItemServiceImpl implements CartItemService {
   @Autowired
   public RedisService redisService;
   @Autowired
   public CartItemMapper cartItemMapper;

   private static final String CART_ITEM = "cart:item:";

   /**
    * 添加购物车
    * @param cartRequest
    */
   @Override
   public void addCartItem(CartRequest cartRequest) {
      LoginUser loginUser = SecurityUtils.getLoginUser();

      String key = CART_ITEM+loginUser.getUserid();

      CartVo cartVo = cartItemMapper.selectskuIdCatrVo(cartRequest.getSkuId());

      String skuAttr = cartItemMapper.selectCartVoAttr(cartRequest.getSkuId());

      cartVo.setUserId(loginUser.getUserid());

      List<CartVo> carts = cartItemMapper.selectCart();

      //卖家是否存在
      cartIsExist(carts,cartVo);

      //购物车商品信息
      cartVo.getCartItemVoList().forEach(cartItemVo -> {
         cartItemVo.setCartId(cartVo.getId());

         cartItemVo.setSkuId(cartRequest.getSkuId());

         cartItemVo.setSkuAttr(skuAttr);

         cartItemVo.setCartItemChecked(1);

         cartItemVo.setCartItemNum(cartRequest.getNum());
      });

      cartVo.getCartItemVoList().forEach(cartItemVo -> {

         //判断购物车是否存在
         if(!redisService.hasKey(key)){
            redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), cartItemVo);

            return;
         }

         if (redisService.hasKey(key)){

            CartItemVo newCartItemVo = (CartItemVo) redisService.getCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()));

            //判断商品是否已存在
            if(newCartItemVo == null){
               redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), cartItemVo);

               return;
            }

            if(newCartItemVo != null){
               newCartItemVo.setCartItemNum(newCartItemVo.getCartItemNum() + cartItemVo.getCartItemNum());

               redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), newCartItemVo);
            }
         }
      });
   }

   /**
    * 删除购物车
    * @param skuIds
    */
   @Override
   public void deleteCartItem(String skuIds) {
      LoginUser loginUser = SecurityUtils.getLoginUser();

      String key = CART_ITEM+loginUser.getUserid();

      //分割删除的skuId
      String[] skuIdList = Convert.toStrArray(skuIds);

      for (String skuId : skuIdList) {
         redisService.deleteCacheMapValue(key, String.valueOf(skuId));
      }

   }

   /**
    * 购物车列表
    * @return
    */
   @Override
   public List<CartVo> cartVoList() {
      LoginUser loginUser = SecurityUtils.getLoginUser();

      String key = CART_ITEM+loginUser.getUserid();

      Map<String, CartItemVo> map = redisService.getCacheMap(key);

      List<CartVo> cartVos = new ArrayList<>();


      CartVo cartVo = new CartVo();

      List<CartItemVo> cartItemVoList = new ArrayList<>();

      map.forEach((k, v) -> {

         CartItemVo cartItemVo = new CartItemVo();

         BeanUtils.copyProperties(v, cartItemVo);

         cartItemVoList.add(cartItemVo);

         Long cartId = v.getCartId();

         CartVo newCartVo = cartItemMapper.selectCartId(cartId);

         BeanUtils.copyProperties(newCartVo, cartVo);

      });

      cartVos.add(cartVo);

      cartVo.setCartItemVoList(cartItemVoList);

      return cartVos;
   }

   /**
    * 卖家是否存在
    * @param carts
    * @param cartVo
    */
   private void cartIsExist(List<CartVo> carts, CartVo cartVo) {
      carts.forEach(cart -> {

         if(!cart.getUserId().equals(cartVo.getUserId())){

            if(!cart.getSellerId().equals(cartVo.getSellerId())){

               cartItemMapper.addCart(cartVo);

            }

         }

         if(cart.getUserId().equals(cartVo.getUserId())){

            if(cart.getSellerId().equals(cartVo.getSellerId())){

               Long cartId = cartItemMapper.selectCartUserId2SellerId(cartVo);

               cartVo.setId(cartId);

            }

         }

      });

   }

}
